<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // Symbol()函数不能与 new 关键字一起作为构造函数使用
    let aSymbol = Symbol();
    console.log(typeof aSymbol);
    console.log(aSymbol);

    // 使用全局符号注册表 Symbol.for()
    // 如果运行时的不同部分需要共享和重用符号实例，那么可以用一个字符串作为键，在全局符号注册表中创建并重用符号
    let generalSym = Symbol.for("foremp");
    console.log(typeof generalSym);
    console.log(generalSym);

    let genderalSym2 = Symbol.for("foremp");

    if (generalSym === genderalSym2) {
      console.log("Symbol.for('foremp') 获取的是在全局符号注册表的同一个Symbol");
    }

    let symkey = Symbol.keyFor(generalSym);
    console.log(symkey);

    let bSym = Symbol("bsym");
    let bSymKey = Symbol.keyFor(bSym);
    console.log(bSymKey);

    // Symbol（符号）是 ECMAScript 6 新增的数据类型。符号是原始值，且符号实例是唯一、不可变的。
    // 符号的用途是确保对象属性使用唯一标识符，不会发生属性冲突的危险。
    class Emitter {
      constructor(max) {
        this.max = max;
        this.asyncIdx = 0;
      }

      async *[Symbol.asyncIterator]() {
        while (this.asyncIdx < this.max) {
          yield new Promise((resolve) => resolve(this.asyncIdx+=2));
        }
      }
    }

    async function asyncCount() {
      let emitter = new Emitter(5);
      for await (const x of emitter) {
        console.log(x);
      }
    }

    asyncCount();


  </script>
</body>

</html>